package zheezes.protocol.impl.gd;

import zheezes.util.ArrayUtil;
import zheezes.util.ByteUtil;

public class DataItem {
	private short di;
	private byte[] data = new byte[0];
	private DataItemDesc desc;

	public DataItem(short di) {
		this.di = di;
		desc = DataItemRegister.query(di);
		data = new byte[desc.getSize()];
	}

	public DataItem(byte[] buf, int offset) {
		int idx = offset;
		di = ByteUtil.ctos(buf, idx);
		desc = DataItemRegister.query(di);
		idx += 2;
		data = new byte[desc.getSize()];
		System.arraycopy(buf, idx, data, 0, data.length);
		if (desc.isInverse()) {
			ArrayUtil.reverse(data);
		}
	}

	public short getDi() {
		return di;
	}

	public byte[] getDiByBytes() {
		return ByteUtil.stoc(di);
	}

	public void setData(byte[] buf) {
		setData(buf, 0);
	}

	// the data is only the data block, no include the di
	public int setData(byte[] buf, int offset) {
		System.arraycopy(buf, offset, data, 0, data.length);
		if (desc.isInverse()) {
			ArrayUtil.reverse(data);
		}
		return data.length;
	}

	public byte[] getBytes() {
		byte[] buf = new byte[2 + data.length];
		ByteUtil.stoc(buf, 0, di);
		System.arraycopy(data, 0, buf, 2, data.length);
		if (desc.isInverse()) {
			ArrayUtil.reverse(buf, 2, data.length);
		}
		return buf;
	}

	public int length() {
		return 2 + data.length;
	}

	public int getDataLength() {
		return data.length;
	}
}
